#!/bin/bash

# 加载通用函数
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"

# 检查 Docker 是否已安装
check_docker() {
    debug "检查Docker安装状态"
    if ! command -v docker &> /dev/null; then
        handle_error "Docker未安装，请先安装Docker"
    fi
    debug "Docker已安装: $(docker --version)"
}

# 检查并初始化Docker Swarm
init_swarm() {
    start_spinner "初始化Docker Swarm..."
    debug "开始初始化Docker Swarm"
    
    # 检查是否已经是swarm manager
    if docker info 2>/dev/null | grep -q "Swarm: active"; then
        debug "检测到Docker Swarm已处于活动状态"
        stop_spinner "success" "Docker Swarm已经初始化"
        return 0
    fi
    
    # 获取服务器IP地址
    local ip_addr=""
    if command -v ip >/dev/null 2>&1; then
        ip_addr=$(ip route get 1 | awk '{print $(NF-2);exit}')
        debug "使用ip命令获取IP地址: $ip_addr"
    else
        ip_addr=$(hostname -i)
        debug "使用hostname命令获取IP地址: $ip_addr"
    fi
    
    if [ -z "$ip_addr" ]; then
        stop_spinner "error" "无法获取服务器IP地址"
        handle_error "无法获取服务器IP地址"
    fi
    
    debug "尝试使用IP地址 $ip_addr 初始化Docker Swarm"
    if ! docker swarm init --advertise-addr "$ip_addr" &>/dev/null; then
        stop_spinner "error" "Docker Swarm初始化失败"
        handle_error "Docker Swarm初始化失败，请检查：\n1. Docker服务是否正常运行\n2. 端口2377、7946、4789是否被占用\n3. 防火墙是否允许这些端口的通信"
    fi
    
    debug "Docker Swarm初始化完成"
    stop_spinner "success" "Docker Swarm初始化成功"
}

# 检查服务是否存在
check_service_exists() {
    local service_name="$1"
    debug "检查服务是否存在: $service_name"
    local result=$(docker service ls --filter name="$service_name" -q)
    if [ -n "$result" ]; then
        debug "服务 $service_name 已存在"
    else
        debug "服务 $service_name 不存在"
    fi
    echo "$result"
}

# 获取服务状态
get_service_status() {
    local service_name="$1"
    debug "获取服务状态: $service_name"
    local service_info=$(docker service inspect "$service_name" 2>/dev/null)
    
    if [ $? -ne 0 ]; then
        debug "无法获取服务信息: $service_name"
        return 1
    fi
    
    # 获取更新状态
    local status=""
    if echo "$service_info" | grep -q '"UpdateStatus": {'; then
        status=$(echo "$service_info" | grep -A 5 '"UpdateStatus": {' | grep '"State":' | cut -d'"' -f4)
        debug "服务更新状态: $status"
    fi
    
    # 如果没有更新状态，检查服务是否正在运行
    if [ -z "$status" ] && docker service ps "$service_name" | grep -q "Running"; then
        status="running"
        debug "服务运行状态: running"
    fi
    
    debug "最终服务状态: $status"
    echo "$status"
}

# 获取服务副本状态
get_service_replicas() {
    local service_name="$1"
    debug "获取服务副本状态: $service_name"
    local replicas=$(docker service ls --filter name="$service_name" --format '{{.Replicas}}')
    debug "服务副本状态: $replicas"
    echo "$replicas"
}
